Firebird INNER JOIN
Otázka od: Radim Hradecky
2. 10. 2004 9:58
Ahoj,
Prevadim svou aplikaci z mysql na Firebird a pri prevodu dotazu
obsahujici INNER JOIN sem narazil na problem. Firebird tvrdosijne vraci ze
sloupec neexistuje. Pouzivam Firebird 1.5 SQL dialect 3
V principu chci vybrat vsechny uzivatele z users kteri maji vice nez 0
volnych minut a pomoci JOINU z trzby zjistit, kdy platili naposledy (neboli
najit posledni zaznam, obsahujici jejich ID). Doufam ze sem to napsal
srozumitelne.
Struktura tabulky "trzba":
ID, primarni klic, auto increment (pres generator)
User_ID, int
Datum, timestamp
Struktura tabulky "users"
ID, primarni klic, auto increment (pres generator)
Volneminuty, int
Dotaz vypada takto:
SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala pismena mam
v poradku, na mysql to fungovalo. Kde je prosim problem?
Dekuji za pomoc
S pozdravem Radim Hradecky
Odpovedá: Pavel Cisar
2. 10. 2004 11:49
Haj hou!
On 2 Oct 2004 at 10:57, Radim Hradecky wrote:
> Struktura tabulky "trzba":
>
> ID, primarni klic, auto increment (pres generator)
> User_ID, int
> Datum, timestamp
>
> Struktura tabulky "users"
> ID, primarni klic, auto increment (pres generator)
> Volneminuty, int
>
> Dotaz vypada takto:
>
> SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
> u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>
> Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
> pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?
A ja bych se vsadil, ze nemas Pokud je deklarace tabulky takova
jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
"User_ID" (v uvozovkach).
S pozdravem
Pavel Cisar ( ICQ: 89017288)
Mobil: 724 281429
http://www.ibphoenix.cz
Vse co potrebujete pro Firebird a InterBase
Odpovedá: Radim Hradecky
2. 10. 2004 13:00
>> Struktura tabulky "trzba":
>>
>> ID, primarni klic, auto increment (pres generator)
>> User_ID, int
>> Datum, timestamp
>>
>> Struktura tabulky "users"
>> ID, primarni klic, auto increment (pres generator)
>> Volneminuty, int
>>
>> Dotaz vypada takto:
>>
>> SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
>> u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>>
>> Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
>> pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?
>A ja bych se vsadil, ze nemas Pokud je deklarace tabulky takova
>jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
>"User_ID" (v uvozovkach).
Tak za to mohli ty uvozovky a zaroven tam bylo chyba i ve velkem a malem
(bohuzel sem vzdy zkousel bud jedno nebo druhe, ne oboje najednou). Bohuzel
stale to jeste neni jak si Firebird preje. Momentalne mam:
SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
"Volneminuty" > 0 Group By u."ID",u."Volneminuty"
Pricemz to hlasi:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate
function or the GROUP BY clause).
Chyba je v tom GROUP BY, pokud to dam pryc jde to. Chce to po mne dat tam i
to "Datum",cimz ale ten group by ztraci vyznam, protoze to je pokazde
jine....
Odpovedá: Tomas Stejskal
3. 10. 2004 9:47
Radim Hradecky wrote:
>>>Struktura tabulky "trzba":
>>>
>>>ID, primarni klic, auto increment (pres generator)
>>>User_ID, int
>>>Datum, timestamp
>>>
>>>Struktura tabulky "users"
>>>ID, primarni klic, auto increment (pres generator)
>>>Volneminuty, int
>>>
>>>Dotaz vypada takto:
>>>
>>>SELECT u.Id,u.Volneminuty,t.Datum FROM "users" u INNER JOIN "trzba" t ON
>>>u.ID=t.User_ID WHERE Volneminuty > 0 Group By u.Id,u.volneminuty
>>>
>>>Firebird tvrdosijne hlasi ze t.User_ID neexistuje. Velka a mala
>>>pismena mam v poradku, na mysql to fungovalo. Kde je prosim problem?
>>>
>>>
>
>
>
>>A ja bych se vsadil, ze nemas Pokud je deklarace tabulky takova
>>jak pises, tedy s User_ID, pak se na nej musis odkazovat jako na
>>"User_ID" (v uvozovkach).
>>
>>
>
>Tak za to mohli ty uvozovky a zaroven tam bylo chyba i ve velkem a malem
>(bohuzel sem vzdy zkousel bud jedno nebo druhe, ne oboje najednou). Bohuzel
>stale to jeste neni jak si Firebird preje. Momentalne mam:
>
>SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
>INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
> "Volneminuty" > 0 Group By u."ID",u."Volneminuty"
>
>Pricemz to hlasi:
>Invalid token.
>Dynamic SQL Error.
>SQL error code = -104.
>Invalid expression in the select list (not contained in either an aggregate
>function or the GROUP BY clause).
>
>Chyba je v tom GROUP BY, pokud to dam pryc jde to. Chce to po mne dat tam i
>to "Datum",cimz ale ten group by ztraci vyznam, protoze to je pokazde
>jine....
>
>
>
>
>
Stacila by drobna uprava:
SELECT u."ID",u."Volneminuty", MAX(t."Datum") FROM "users" u
INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
"Volneminuty" > 0 Group By u."ID",u."Volneminuty"
prip. upravit dotaz bez groupovani:
SELECT
u."ID",
u."Volneminuty",
(SELECT MAX(t."Datum") FROM "trzba" t WHERE t."User_ID" = u."ID") as Datum
FROM "users" u
WHERE u."Volneminuty" > 0
Jinak bych doporucoval nepouzivat v CREATE TABLE pro nazvy fieldu uvozovky.
S pozdravem
Tomas Stejskal
Aktis, a. s.
Odpovedá: petr palicka
4. 10. 2004 6:56
> SELECT u."ID",u."Volneminuty",t."Datum" FROM "users" u
> INNER JOIN "trzba" t ON u."ID"=t."User_ID" WHERE
> "Volneminuty" > 0 Group By u."ID",u."Volneminuty"
Myslim, ze uz drive jsi psal ze chces posledni datum, potom musis v
dotazu mit max(t."Datum").
Nebo si lepe rozmysli, co vlastne z toho dotazu chces.
Peca